#!/bin/bash
# korkeimmalla tasolla funktioilla ei voi olla funktioita tai se ei olisi ylin taso. Parametreja korkeimman tason fuktioilla on niinkuin aina muulloinkin.
# echo "-1-[[[2*6+1]]/1.441e3]+[[sin210-cos60]*tan60*2]/[3^.5]*ln[e^-pi]/pi" | grep -Po [[].[^[]*[^[][]] | grep  '\[\['

function etsi_laskukaavan_korkeimman_tason_vasemmanpuoleisimman_sulun_teksti  () {
tulos=$1

korkeintaso=0; olintaso=0 # määritellään korkein taso
for (( n=0; n<=${#tulos}; n++ )); do
  [[ ${tulos:$n:1} = "[" ]] && let olintaso++  
  [[ $olintaso -gt $korkeintaso ]] && korkeintaso=$olintaso
  [[ ${tulos:$n:1} = "]" ]] && let olintaso--
done
olintaso=0 # etsitään teksti joka sillä korkeimmalla tasolla on
for (( n=0; n<=${#tulos}; n++ )); do
  [[ ${tulos:$n:1} = "[" ]] && let olintaso++ 
  [[ ${tulos:$n:1} = "]" ]] && let olintaso--
  tekstinalku=$n 
  [[ $olintaso = $korkeintaso ]] && break
done
for (( m=tekstinalku; m<=${#tulos}; m++ )); do
  [[ ${tulos:$m:1} = "]" ]]  &&  tekstinloppu=$m && break
done
}

function laita_se_laskentaan_ja_korvaa_sulun_teksti_lasketulla_arvolla () {
echo "ollaan lähettämässä laskentaan"
scale=$1
tulos_alussa="$tulos"
suluissa_oleva="${tulos:$tekstinalku:$(($tekstinloppu-$tekstinalku+1))}"; echo -n $suluissa_oleva
ilman_sulkuja=$(echo $suluissa_oleva | sed 's/^\[*//g;s/\]*$//g'); echo -n "  eka_suluissa oleva ilman sulkuja:$ilman_sulkuja"  
laske "scale"$scale"k"$ilman_sulkuja  $scale > delme  # kolmas_parametri_estää_enemmät_rekursiot; cat delme 
arvo_laskettuna=$(cat delme | tail -n 1); echo "  kutsussa:"$tulos_alussa"   sana:"$eka_suluissa_oleva"    muutetaan sanaksi:"$eka_suluissa_oleva_laskettuna
uusi_tulos=${tulos_alussa%%[*}$arvo_laskettuna${tulos_alussa#*]}; tulos=$uusi_tulos; echo "uusi tulos:"$tulos 
}


tulos="2^[3+4^[1+2*[a+b]]]+e^[sin[1111^11*[1+2^[1+2]*2+3]]]*e[sin30]"
etsi_laskukaavan_korkeimman_tason_vasemmanpuoleisimman_sulun_teksti $tulos 
laita_se_laskentaan_ja_korvaa_sulun_teksti_lasketulla_arvolla
echo $tulos

